route.ts 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. import { NextRequest, NextResponse } from 'next/server';
  2. import { prisma } from '@/lib/prisma';
  3. export async function GET(
  4. request: NextRequest,
  5. { params }: { params: Promise<{ id: string }> }
  6. ) {
  7. try {
  8. const { id } = await params;
  9. const importId = parseInt(id);
  10. if (isNaN(importId)) {
  11. return NextResponse.json(
  12. { error: 'Invalid import ID' },
  13. { status: 400 }
  14. );
  15. }
  16. // Check if import exists
  17. const importRecord = await prisma.import.findUnique({
  18. where: { id: importId }
  19. });
  20. if (!importRecord) {
  21. return NextResponse.json(
  22. { error: 'Import not found' },
  23. { status: 404 }
  24. );
  25. }
  26. // Get basic summary data
  27. const totalRecords = await prisma.cintasInstallCalendar.count({
  28. where: { importId }
  29. });
  30. const cintasSummaries = await prisma.cintasSummary.findMany({
  31. where: { importId },
  32. orderBy: { weekId: 'desc' }
  33. });
  34. // Get file info
  35. const file = importRecord.fileId ? await prisma.file.findUnique({
  36. where: { id: importRecord.fileId }
  37. }) : null;
  38. const summary = {
  39. totalRecords,
  40. totalWeeks: cintasSummaries.length,
  41. cintasSummaries: cintasSummaries.map((summary: any) => ({
  42. id: summary.id,
  43. week: summary.week,
  44. trrTotal: summary.trrTotal,
  45. fourWkAverages: summary.fourWkAverages,
  46. trrPlus4Wk: summary.trrPlus4Wk,
  47. powerAdds: summary.powerAdds,
  48. weekId: summary.weekId
  49. }))
  50. };
  51. return NextResponse.json({
  52. importId,
  53. fileName: file?.filename || 'Unknown',
  54. uploadDate: importRecord.createdAt,
  55. summary,
  56. summaryExists: cintasSummaries.length > 0
  57. });
  58. } catch (error) {
  59. console.error('Error fetching import summary:', error);
  60. return NextResponse.json(
  61. { error: 'Failed to fetch import summary' },
  62. { status: 500 }
  63. );
  64. }
  65. }
  66. export async function POST(
  67. request: NextRequest,
  68. { params }: { params: Promise<{ id: string }> }
  69. ) {
  70. try {
  71. const { id } = await params;
  72. const importId = parseInt(id);
  73. if (isNaN(importId)) {
  74. return NextResponse.json(
  75. { error: 'Invalid import ID' },
  76. { status: 400 }
  77. );
  78. }
  79. // Check if import exists
  80. const importRecord = await prisma.import.findUnique({
  81. where: { id: importId }
  82. });
  83. if (!importRecord) {
  84. return NextResponse.json(
  85. { error: 'Import not found' },
  86. { status: 404 }
  87. );
  88. }
  89. // Check if summary already exists
  90. const existingSummaries = await prisma.cintasSummary.count({
  91. where: { importId }
  92. });
  93. if (existingSummaries > 0) {
  94. // Return existing summary
  95. const cintasSummaries = await prisma.cintasSummary.findMany({
  96. where: { importId },
  97. orderBy: { weekId: 'desc' }
  98. });
  99. return NextResponse.json({
  100. importId,
  101. summaryGenerated: false,
  102. message: 'Summary already exists',
  103. summary: cintasSummaries.map((summary: any) => ({
  104. week: summary.week,
  105. trrTotal: summary.trrTotal,
  106. fourWkAverages: summary.fourWkAverages,
  107. trrPlus4Wk: summary.trrPlus4Wk,
  108. powerAdds: summary.powerAdds
  109. }))
  110. });
  111. }
  112. await prisma.$executeRawUnsafe(
  113. `CALL cintas_calculate_summary(${importId})`
  114. );
  115. // Fetch the newly generated summary
  116. const cintasSummaries = await prisma.cintasSummary.findMany({
  117. where: { importId },
  118. orderBy: { weekId: 'desc' }
  119. });
  120. return NextResponse.json({
  121. importId,
  122. summaryGenerated: true,
  123. message: 'Summary generated successfully',
  124. summary: cintasSummaries.map((summary: any) => ({
  125. id: summary.id,
  126. week: summary.week,
  127. trrTotal: summary.trrTotal,
  128. fourWkAverages: summary.fourWkAverages,
  129. trrPlus4Wk: summary.trrPlus4Wk,
  130. powerAdds: summary.powerAdds,
  131. weekId: summary.weekId
  132. }))
  133. });
  134. } catch (error) {
  135. console.error('Error generating summary:', error);
  136. return NextResponse.json(
  137. { error: 'Failed to generate summary', details: error instanceof Error ? error.message : 'Unknown error' },
  138. { status: 500 }
  139. );
  140. }
  141. }